package javaCode.chapter14.generic;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 徐州城
 * @version 1.0
 */
@SuppressWarnings("all")
public class GenericDetail {
    public static void main(String[] args) {

        //1. 给泛型指向数据类型是，要求引用类型，不能基本数据类型
        List<Integer> list = new ArrayList<Integer>();//正确
        //List<int> list2 = new ArrayList<>();

        //2. 说明
        //因为 E 指定了 A 类型，构造器传入了 new A()
        //在给泛型指定具体类型后，可以传入该类型或者其子类类型
        Pig<A> aPig = new Pig<>(new A());
        Pig<A> aPig2 = new Pig<>(new B());

        //3. 泛型的使用形式
        List<Integer> list1 = new ArrayList<Integer>();
        ArrayList<Integer> list2 = new ArrayList<>();
        //在实际开发中，我们往往简写
        //编译器会进行类型推断，推荐使用下面这种写法
        ArrayList<Integer> list3 = new ArrayList<>();

        //4. 如果我们这样写 默认给它的 泛型是 [<E> E就是Object]
        ArrayList arrayList = new ArrayList();//等价于 ArrayList<Object> list = new ArrayList<>();
        arrayList.add("xx");
        /*
            public boolean add(E e) {
                ensureCapacityInternal(size + 1);  // Increments modCount!!
                elementData[size++] = e;
                return true;
            }
         */

    }
}

class A{}

class B extends A{}

class Pig<E>{
    E e;

    public Pig(E e) {
        this.e = e;
    }
}